package com.digital.smartgrow.common.config.mybatis;

import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description: mybatis-plus代码生成器
 */
@Slf4j
public class MybatisPlusGeneratorConfig {

    /**
     * @Description: 根据数据库表名自动生成代码(controller 、 service 、 entity 、 dao 、 mapper)
     */
    public static void main(String[] args) {
        String author = "sunyuechao";
        String mysqlUrl = null;
        String database = null;
        String userName = null;
        String password = null;
        String packageName = "export";
        String[] tableName =
                {
//                "administration_honor",
//                "advanced_talent",
//                "competition_award",
//                "contract",
//                "education_experience",
//                "government_duty",
//                "job",
//                "parttime_job",
//                "personal_award",
//                "professional_title",
//                "punishment",
//                "service_temp",
//                "talent_honor",
//                "teacher_certificate",
//                "train_experience",
//                "visit_experience",
//                "worker_level",
                     //   "up_job",
                     //   "expert_choose",
                    //    "expert_plan",
                      //  "expert_group",
                      //  "up_pubilcity"
                        "export_approve"

                };
        TemplateConfig templateConfig = new TemplateConfig();
        //根据实际情况选择 是否重新生成
        templateConfig.setController("/templates/controller.java");//不生成控制层
        templateConfig.setService("/templates/service.java");//不生成service
        templateConfig.setServiceImpl("/templates/serviceImpl.java");//不生成实现类
//        templateConfig.setMapper(null);//不生成mapper
        MybatisPlusGeneratorConfig.generatorCode(author, mysqlUrl, database, userName, password, packageName, templateConfig, tableName);
    }

    /**
     * @param author         作者
     * @param mysqlUrl       数据路路径:ip+端口号,eg: 47.99.208.241:3306(默认)
     * @param databaseName   数据库名称，eg: smart_grow(默认)
     * @param userName       数据库用户名，root(默认)
     * @param password       数据库密码,SmartCampus@2021(默认)
     * @param packageName    包名
     * @param templateConfig
     * @param tableName      数据库表名,可以有多个表，eg: {"Collector","Device"}
     */
    public static void generatorCode(String author, String mysqlUrl, String databaseName, String userName, String password, String packageName, TemplateConfig templateConfig, String... tableName) {

        // 1.代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 2.全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");

        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor(author).setOpen(false);
        //实体属性 Swagger2 注解
        gc.setSwagger2(true);
        gc.setFileOverride(true);//会覆盖先前的,置为false则已生成的文件不再生成
//        gc.setIdType(IdType.ASSIGN_ID);
        // 默认生成的 service 会有 I 前缀
        gc.setServiceName("%sService");
        gc.setBaseResultMap(true);
//        gc.setDateType(DateType.ONLY_DATE);
        mpg.setGlobalConfig(gc);

        // 3.数据源配置
        DataSourceConfig dsc = new DataSourceConfig();

        StringBuilder mysqlSb = new StringBuilder();
        mysqlSb.append("jdbc:mysql://");

        String url = "47.99.208.241:3306";
        //String url = "127.0.0.1:3306";

        if (StringUtils.isNotBlank(mysqlUrl)) url = mysqlUrl;
        mysqlSb.append(url).append("/");
        String database = "smart_grow";
        if (StringUtils.isNotBlank(databaseName)) database = databaseName;
        mysqlSb.append(database);
        mysqlSb.append("?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true");
        dsc.setUrl(mysqlSb.toString());
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        String name = "root", pd = "SmartCampus@2021";
       // String name = "root", pd = "Password=123";
        if (StringUtils.isNotBlank(userName)) name = userName;
        if (StringUtils.isNotBlank(password)) pd = password;
        dsc.setUsername(name);
        dsc.setPassword(pd);
        dsc.setTypeConvert(new MySqlTypeConvertCustom());//防止tinyint转换为Boolean类型
        mpg.setDataSource(dsc);

        // 4.包配置
        PackageConfig pc = new PackageConfig();
        //todo 结合实际情况配置
        pc.setParent("com.digital.smartgrow");
//        pc.setModuleName("energy");
        String daoPackage = "dao";
        String entityPackage = "entity";
        String controllerPackage = "controller";
        String servicePackage = "service";
        String serviceImplPackage = "service.impl";
        if (StringUtils.isNotBlank(packageName)) {
            daoPackage = String.format("%s.%s", daoPackage, packageName);
            entityPackage = String.format("%s.%s", entityPackage, packageName);
            controllerPackage = String.format("%s.%s", controllerPackage, packageName);
            servicePackage = String.format("%s.%s", servicePackage, packageName);
            serviceImplPackage = String.format("service.%s.impl", packageName);
        }
        pc.setMapper(daoPackage);
        pc.setEntity(entityPackage);
        pc.setController(controllerPackage);
        pc.setService(servicePackage);
        pc.setServiceImpl(serviceImplPackage);
        mpg.setPackageInfo(pc);


        // 5.自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };

        //5.1 自定义模板
        // 如果模板引擎是 freemarker
        String templatePath = "/templates/mapper.xml.ftl";
//         如果模板引擎是 velocity
//        String templatePath = "/templates/mapper.xml.vm";
        //5.2自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出
        String finalDataNumber = packageName;
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
                String fileUrl = String.format("/src/main/resources/mapper/%s/%sMapper%s", finalDataNumber, tableInfo.getEntityName(), StringPool.DOT_XML);
                return projectPath + fileUrl;
//                return projectPath + "/src/main/resources/mapper/first/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
//                return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
//                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });

        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

        // 5.3配置模板
        if (templateConfig == null) templateConfig = new TemplateConfig();
        templateConfig.setXml(null);
        mpg.setTemplate(templateConfig);

        // 5.4策略配置
        StrategyConfig strategy = new StrategyConfig();
        //需要生成的数据库表名，数组
        strategy.setInclude(tableName);//需要生成所有就注释这一行
        strategy.setNaming(NamingStrategy.underline_to_camel);//匹配下划线驼峰
//        strategy.setNaming(NamingStrategy.no_change);//实体与表名一致
        strategy.setColumnNaming(NamingStrategy.no_change);//实体属性与表字段一致
        strategy.setEntityTableFieldAnnotationEnable(true);

        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);//controller是否使用restful风格
//        strategy.setSuperControllerClass(BaseController.class);
        //去掉字段前缀is
        strategy.setFieldPrefix("is");
        // 配置驼峰转连字符
//        strategy.setControllerMappingHyphenStyle(true);
        // 配置表前缀，生成实体时去除表前缀
        // 此处的表名为 test_mybatis_plus_user，模块名为 test_mybatis_plus，去除前缀后剩下为 user。
//        strategy.setTablePrefix(pc.getModuleName() + "_");

        mpg.setStrategy(strategy);
        // 5.5选择 freemarker 引擎需要指定如下加，注意 pom 依赖必须有！
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        // Step6：执行代码生成操作
        mpg.execute();
    }


}
